#ifndef __NET_CONSTANTS_H__
#define __NET_CONSTANTS_H__

#include <cstdint>

namespace LiteNetLib
{
    // 数据包传输方式
    enum class DeliveryMethod
    {
        ReliableUnordered   = 0,    // 可信赖的数据包不会被丢弃，不会被复制，可以在无序的情况下到达。
        Sequenced           = 1,    // 不可靠的。数据包可以丢弃，不会重复，会按顺序到达。
        ReliableOrdered     = 2,    // 可靠有序。数据包不会丢失，不会重复，会按顺序到达。
        ReliableSequenced   = 3,    // 仅最后一个数据包可靠。数据包可以丢弃（最后一个除外），不会重复，将按顺序到达。
        Unreliable          = 4     // 不可靠的。数据包可以丢弃，可以复制，可以在没有顺序的情况下到达。
    };

    enum class UnconnectedMessageType
    {
        BasicMessage        ,
        Broadcast           ,
    };

    namespace NetConstants
    {
        extern const int32_t DefaultWindowSize;
        extern const int32_t SocketBufferSize;
        extern const int32_t SocketTTL;

        extern const int32_t HeaderSize;
        extern const int32_t ChanneledHeaderSize;
        extern const int32_t FragmentHeaderSize;
        extern const int32_t FragmentedHeaderTotalSize;
        extern const uint16_t MaxSequence;
        extern const uint16_t HalfMaxSequence;

        extern const int32_t ProtocolId;
        extern const int32_t MaxUdpHeaderSize;

        extern const int32_t PossibleMtu[7];

        extern const int32_t MaxPacketSize;
        extern const uint8_t MaxConnectionNumber;
        extern const int32_t PacketPoolSize;

        extern const int32_t DisconnectTimeout;

        extern int32_t PacketResendDelay;

        extern const int32_t StandardPacketSize;

        // 每10秒 最多收到多少个包，多了直接封号
        extern uint32_t banIpLimitPackageCount;
        // 每 10秒 清理掉多少个包的数据记录
        extern uint32_t secondClearPackageCount;
        // 多少 毫秒(ms) 清理下封禁表
        extern uint32_t secondClearBan;
    }
    
}

#endif
